package cn.yu.od;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * 一支N个士兵的军队正在趁夜色逃亡，途中遇到一条湍急的大河。
 *  敌军在T的时长后到达河面，没到过对岸的士兵都会被消灭。
 * 现在军队只找到了1只小船，这船最多能同时坐上2个士兵。
 * 请帮忙给出一种解决方案，保证存活的士兵最多，且过河用时最短。
 *
 * 输入描述
 * 第一行：N 表示士兵数(0<N<1,000,000)
 * 第二行：T 表示敌军到达时长(0 < T < 100,000,000)
 * 第三行：a[0] a[1] … a[i]… a[N- 1]  a[i]表示每个士兵的过河时长。  (10 < a[i]< 100; 0<= i< N）
 *
 * 输出描述
 * 第一行：”最多存活士兵数” “最短用时”
 *
 * 本题是动态规划问题，可以使用动态规划求解。dp[i]表示有i个士兵时最短的过河时间，状态转移方程如下：
 *
 * dp[i] = min(dp[i - 1] + a[0] + get_shorter_time(a[0], a[i]), dp[i - 2] + a[0] + get_shorter_time(a[i - 1], a[i]) + a[1] + get_shorter_time(a[0], a[1]))
 *
 * 其中，dp[i - 1] + a[0] + get_shorter_time(a[0], a[i])表示一个士兵过河，
 * dp[i - 2] + a[0] + get_shorter_time(a[i - 1], a[i]) + a[1] + get_shorter_time(a[0], a[1])
 * 表示两个士兵过河，第一个士兵划船，第二个士兵可以划船或者游泳，取用时最短的方法。
 * 最后，如果dp[i] > T，则输出i - 1和dp[i - 1]。
 *
 * https://blog.csdn.net/banxia_frontend/article/details/123569879
 *
 * case1
 * 5
 * 43
 * 12 13 15 20 50
 * 输出：3 40
 *
 * @Author : Ning Yu
 * @create 2023/3/25 15:30
 */
public class ShiBinGuoHe {


    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        //士兵数量
        int nums = Integer.parseInt(scanner.nextLine());
        //限制时间
        int limit = Integer.parseInt(scanner.nextLine());
        //划船速度
        String speedStr = scanner.nextLine();
        String[] ss = speedStr.split(" ");
        int[] speeds = new int[nums];
        for (int i = 0; i < nums; i++) {
            speeds[i] = Integer.parseInt(ss[i]);
        }
        Arrays.sort(speeds);
        int current = 0, time = 0;
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 1; i <= speeds.length; i++) {
            int minTime = minTime(speeds, i, map);
            if(minTime <= limit){
                current ++;
                time = minTime;
            }
        }
        System.out.println(current + " " + time);

    }

    public static int minTime(int[] speeds, int num, Map<Integer, Integer> map){
        int time;
        if(map.containsKey(num)){
            return map.get(num);
        }
        if(num == 1){
            //一个人过河取最快
            time = speeds[0];
        } else if (num == 2) {
            //两个人过河，取前二
            time = speeds[1];
        } else if (num == 3){
            //三 ： 12过，1回，13过
            time = speeds[1] +  speeds[0] + speeds[2];
        }else {
            //四 ： 12过，1回，34过，2回， + 两人过河
            //五 ： 12过，1回，45过，2回， + 三人过河
            //六 ： 12过，1回，56过，2回,  + 四人过河
            //n ： 12过，1回，n, n-1过， 2回 + n-2人过河
            time = speeds[1] +  speeds[0] + speeds[num - 1] + speeds[1] + minTime(speeds,num - 2, map);
        }
        //减枝
        map.put(num, time);
        return time;
    }
}
